/**
 * @file usart.c
 * @author liqiang (liqiang@hacint.com.cn)
 * @brief 
 * @version 1.0.0
 * @date 2023-08-15
 * 
 * 
 */

#include <stdio.h>


#include "HAL_Type.h" 
#include "usart.h"
#include "delay.h"  

 
//#if 1
//#pragma import(__use_no_semihosting)             
// /**
//  * @brief 标准库需要的支持函数  
//  * 
//  */
//struct __FILE 
//{ 
//	int handle; 
//}; 

#if 1
/* 移除 #pragma import(__use_no_semihosting) */

/* 禁用半主机模式的正确方式 */
#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
  /* ARM Compiler 6 */
  __asm(".global __use_no_semihosting");
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION < 6010050)
  /* ARM Compiler 5 */
  #pragma import(__use_no_semihosting)
#endif



FILE __stdout;       

/**
 * @brief 定义_sys_exit()以避免使用半主机模式  
 * 
 * @param x 
 */
void _sys_exit(int x) 
{ 
    x = x; 
} 

/**
 * @brief 重定义fputc函数 
 * 
 * @param ch 
 * @param f 
 * @return int 
 */
int fputc(int ch, FILE *f)
{ 	
    while((USART1->SR&0X40)==0); 
    USART1->DR = (u8) ch;      
    return ch;
}
#endif

#if EN_USART1_RX    
 	
  
UART_HandleTypeDef UART1_Handler;  

/**
 * @brief 初始化IO 串口1 
 * 
 * 
 * @param bound :波特率
 */
void uart_init(u32 bound)
{	
 
	UART1_Handler.Instance=USART1;					    
	UART1_Handler.Init.BaudRate=bound;				    
	UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B;    
	UART1_Handler.Init.StopBits=UART_STOPBITS_1;	   
	UART1_Handler.Init.Parity=UART_PARITY_NONE;		   
	UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   
	UART1_Handler.Init.Mode=UART_MODE_TX_RX;		     
	HAL_UART_Init(&UART1_Handler);					    
	
 
	__HAL_UART_ENABLE_IT(&UART1_Handler, UART_IT_RXNE);  
}

void Plat_uart_Init(void){

	uart_init(115200)	;
}

/**
 * @brief UART底层初始化，时钟使能，引脚配置，中断配置
 * 此函数会被HAL_UART_Init()调用
 * huart:串口句柄 
 * 
 * @param huart 
 */

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
 
	GPIO_InitTypeDef GPIO_Initure;
	
	if(huart->Instance==USART1) 
	{
		__HAL_RCC_GPIOA_CLK_ENABLE();		 
		__HAL_RCC_USART1_CLK_ENABLE();			 
	
		GPIO_Initure.Pin=GPIO_PIN_9|GPIO_PIN_10; 
		GPIO_Initure.Mode=GPIO_MODE_AF_PP;		 
		GPIO_Initure.Pull=GPIO_PULLUP;			 
		GPIO_Initure.Speed=GPIO_SPEED_HIGH;		 
		GPIO_Initure.Alternate=GPIO_AF7_USART1;	 
		HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	 
		
 	
#if EN_USART1_RX
		HAL_NVIC_EnableIRQ(USART1_IRQn);		 
		HAL_NVIC_SetPriority(USART1_IRQn,3,3);	 
#endif	
	}
}

 
 
/**
 * @brief 
 * 
 */
 
 


/**
 * @brief 串口1中断服务程序
 * 
 */
void USART1_IRQHandler(void)                	
{ 
	u8 Res;
	if((__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_RXNE)!=RESET))  //�����ж�(���յ������ݱ�����0x0d 0x0a��β)
	{
        HAL_UART_Receive(&UART1_Handler,&Res,1,1000); 

	}

} 
#endif


 




